// 采用 function 关键字来定义"类"

// 当采用 function 定义 Panda 函数时:
// 1、声明了一个名称是 Panda 的变量
// 2、声明了一个名称是 Panda 的函数
// 3、声明了一个名称是 Panda 的"对象"(即Java语言中所说的"类")
//    并且已经隐式地设置了该"对象"的原型(prototype)
// 4、声明了一个名称是 Panda 的构造函数
function Panda( name ){
    console.log( 'hello');
    // 通过 this 为新创建的实例绑定 name 属性
    this.name = name ;
}

// 通过 Panda "对象" 本身动态添加的属性 属于 静态属性
Panda.school = '大熊猫学院';
// 若某个静态属性的取值是个函数，则将其称作 静态方法
Panda.show = () => {
    console.log( Panda.school );
}
// 调用 静态方法
Panda.show();

console.log( '- '.repeat( 10 ) );

// 通过 原型 动态添加的属性 属于 原型属性(供实例使用)
Panda.prototype.introduce = function(){
    console.log( `大家好，我是${this.name}` );
}

// 4、利用构造函数创建 实例(instance)
let p = new Panda( '大美' );
console.log( p );
p.introduce(); // 调用从原型链上继承的方法

// 3、获取并输出 Panda "对象" 的 原型
console.log( Panda.prototype );

// 2、作普通函数调用
Panda(); 

// 1、修改变量中存储的值
Panda = 100;
console.log( Panda );


// 总结:
// 通过 "对象" 本身 定义的属性属于静态属性，将来必须通过 "对象" 来访问
// 通过 原型 定义的属性属于原型属性，将来可以通过实例来访问